package interceptors

import (
	"gpt-api/framework/auther"
	"gpt-api/framework/ginplus"

	"github.com/gin-gonic/gin"
	"github.com/pkg/errors"
)

// UserAuth 用户授权中间件
func UserAuth(a auther.Auther, skipper ...SkipperFunc) gin.HandlerFunc {
	return func(c *gin.Context) {
		// 不需要检测token 且 未传token的直接跳出校验token
		t := ginplus.GetToken(c)
		if len(skipper) > 0 && skipper[0](c) && t == "" {
			c.Next()
			return
		}

		var (
			info *auther.UserInfo
			err  error
		)

		// 传了token 的无论需不需要鉴权，都尝试解析，方便记录登录用户相关信息
		if t != "" {
			info, err = a.ParseUserID(t)
			if err != nil {
				// 如果不需要鉴权的接口传了token并且校验失败，也能正常返回
				if len(skipper) > 0 && skipper[0](c) {
					c.Next()
					return
				}

				ginplus.ReplyUnauthorized(c, errors.Wrap(err, "用户授权中间件"))
				c.Abort()
				return
			}
			ginplus.SetUserID(c, info.UserId)
		}
		// fmt.Println("info:", info.UserId)
		if info == nil || info.UserId == 0 {
			// if viper.GetString("auth.mode") == "debug" {
			// 	// ginplus.SetUserID(c, viper.GetUint64("auth.root"))
			// 	c.Next()
			// 	return
			// }

			// return 用户未登录 页面
			ginplus.ReplyUnauthorized(c, nil)
			c.Abort()
		}
	}
}
